package 案例;

//通过文件操作，在输入的路径中按照 文件名或文件内容 进行查找是包含key
//返回包含 key的文件路径

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class 案例3 {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);

        //1.用户输入一个 待搜索的路径
        System.out.println("请输入要扫描的根路径/根目录：");
        String root=scanner.next();
        File rootPath=new File(root);

        if (!rootPath.isDirectory()) {
            //不是根目录
            System.out.println("输入的路径不是根目录，程序退出");
            return;
        }

        //2.再输入 查询词，表示搜索的结果中要包含这个查询词
        System.out.println("请输入要查询的词");
        String key=scanner.next();

        //3.遍历目录及文件，进行查找匹配
        List<File> res=new ArrayList<>();
        scanDirWithKey(rootPath,key,res);

        //4.打印结果res
        for (File f:res) {
            System.out.println(f.getCanonicalPath());
        }
    }

    private static void scanDirWithKey(File rootPath, String key, List<File> res) {
        File[] files=rootPath.listFiles();
        System.out.println(Arrays.toString(files));

        if (files==null || files.length==0){
            //rootPath中没有文件时，为null
            return;
        }

        for (File f:files) {
            if (f.isDirectory()) {
                //当前文件为 目录文件
                scanDirWithKey(f,key,res);
            }else {
                if (f.getName().contains(key)) {
                    //文件名中是否含 key
                    res.add(f);
                }
                if (isHaveKey(f,key)) {
                    //文件内容中是否含 key
                    res.add(f);
                }
            }
        }
    }

    private static boolean isHaveKey(File f, String key) {
        // 打开 f 这个文件，依次取出每一行数据
        // 每一行数据都和 key 进行 indexOf

        StringBuilder stringBuilder=new StringBuilder();

        try(InputStream inputStream=new FileInputStream(f)) {
            Scanner scanner=new Scanner(inputStream,"UTF-8");
            while (scanner.hasNextLine()) {
                //按行读取
                String line=scanner.nextLine();
                stringBuilder.append(line+"\n");//  "\n" 换行符
            }

        }catch (IOException e) {
            e.printStackTrace();
        }

        //StringBuilder中的 indexOf()方法，没找到返回-1，找到返回下标值
        return stringBuilder.indexOf(key) != -1;
    }
}
